انتقل إلى المحتوى الرئيسي

سرفس الزبائن (CustomerService)

شنو تسوي هاي السرفس؟​

CustomerService عبارة عن كلاس مسؤول عن إدارة عمليات الزبائن داخل النظام، مثل إضافة زبون جديد.


الحقول (Fields) المستخدمة​

private readonly AppDbContext _context;
private readonly AccountsService _accountService;
المتغيّرشنو يسوي؟
_contextيمثل قاعدة البيانات (Entity Framework).
_accountServiceيتعامل ويا حسابات المالية الزبائن، مثل إنشاء حساب جديد.

الكونستركتر​

public CustomerService(AppDbContext context, AccountsService accountService)
  • يحقن قاعدة البيانات وخدمة الحسابات حتى نستخدمهم داخل الكلاس.

الدالة Add(...)​

public async Task<CustomerResponse> Add(string name, string? phoneNumber, string? address, CancellationToken ct)

هاي الدالة تضيف زبون جديد، وتتكون من الخطوات التالية:


1. التحقق إذا الزبون موجود مسبقًا​

var customerExist = await _context.Customer
.IgnoreQueryFilters()
.Where(c => c.Name == name)
.FirstOrDefaultAsync(ct);
  • يبحث إذا أكو زبون بنفس الاسم، حتى لو كان محذوف.
  • يستخدم IgnoreQueryFilters حتى يشوف الزبائن المحذوفين مؤقتًا (soft delete).

2. التحقق من حالة الزبون​

  • إذا الزبون موجود وممـحـذوف:
if (customerExist != null && customerExist.DeletedAt == null)
throw new ApiException("CustomerWithTheSameNameExist", "زبون بنفس الاسم موجود", 409);
  • إذا الزبون موجود لكن محذوف:
if (customerExist != null && customerExist.DeletedAt != null)
throw new ApiException("DeletedCustomerWithTheSameNameExist", "زبون بنفس الاسم موجود لكن محذوف. هل تريد استعادته؟", 409);

3. إنشاء حساب مالي للزبون​

var account = await _accountService.NewAccount(name, CommonAccountOption.Customers, ct);
  • ينشئ حساب مالي مرتبط بالزبون تحت نوع Customers.

4. إنشاء الزبون وحفظه​

var customer = new CustomerModel {
Id = Ulid.NewUlid(),
Name = name,
PhoneNumber = phoneNumber,
Location = address ?? "",
AccountId = account.Id
};
  • ينشئ كائن الزبون.
  • إذا العنوان ما موجود، يحط قيمة فارغة بدلًا عنه.

5. حفظ الحساب والزبون بقاعدة البيانات​

await _accountService.SaveAccount(account, ct);
_context.Customer.Add(customer);
await _context.SaveChangesAsync(ct);

6. إرجاع الرد​

return new CustomerResponse(customer);
  • يرجع نسخة من الزبون باستخدام كلاس CustomerResponse.

ملاحظات​

  • النظام يستخدم Soft Delete (يعني الزبون ينحذف بس ما ينمسح من قاعدة البيانات).
  • يستخدم Ulid كـ ID للزبون (مميز وزمني).
  • يعتمد على خدمات أخرى مثل AccountsService.